﻿using System;
using System.IO;

namespace SetupBuilder
{
    /// <summary>
    /// Осуществляет построение установочного пакета.
    /// </summary>
    public class Builder
    {
        /// <summary>
        /// Настройки построения.
        /// </summary>
        private Settings settings;

        /// <summary>
        /// Инициализирует экземпляр строителя.
        /// </summary>
        public Builder(Settings settings)
        {
            this.settings = settings;
        }

        /// <summary>
        /// Осуществляет настройку параметров проекта перед построением.
        /// </summary>
        public void PrepareProject()
        {
            this.settings.SetVariables();
        }

        /// <summary>
        /// Выполняет построение.
        /// </summary>
        /// <returns>Если построение успешно - возвращает true, иначе - false.</returns>
        public bool Build()
        {
            string log = null;

            try
            {
                log = Cmd.RunHidden(@"%windir%\Microsoft.NET\Framework\v4.0.30319\MsBuild.exe /verbosity:minimal /t:rebuild /p:Configuration=Release "
                    + Path.GetFullPath(
                        Path.Combine(
                            this.settings.ProjectDir,
                            @"..\SetupSNOEditor.sln")));

                if (string.IsNullOrEmpty(log) || log.IndexOf("error") != -1)
                {
                    throw new Exception("В логе построения обнаружены ошибки");
                }
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Ошибка при построении\nЛог: {0}", log), ex);
            }

            this.MoveMsiFile();

            return true;
        }

        private void MoveMsiFile()
        {
            try 
	        {	        
		        File.Move(Path.Combine(this.settings.ProjectDir, @"bin\Release\ru-ru\SetupSNOEditor.msi"), this.settings.OutPath);
	        }
	        catch (Exception ex)
	        {
		        throw new Exception("Ошибка при перемещении msi файла в выходную директорию", ex);
	        }
        }
    }
}
